#ifndef SQLMAIN_H
#define SQLMAIN_H

#include <QObject>
class QSqlDatabase;
class SqlMain : public QObject
{
    Q_OBJECT
protected:
    explicit SqlMain(QObject *parent = nullptr);

public:
    static SqlMain* getObject();
    /**
     * @brief 向数据库插入数据，应当选择合适的类型调用
     * @param type 设备类型
     * @param index 设备索引
     * @param value 值
     */
    void insertValue(int type, int index, int value);
    void insertValue(int type, int index, double value);
    void insertValue(int type, int index, bool value);
    void insertValue(int type, int index, QString value);
    /**
     * @brief 更新设备心跳时间
     * @param type 设备类别
     * @param index 设备索引
     */
    void updateDeviceTime(int type, int index);
    /**
     * @brief 用户登录
     * @param username 用户名
     * @param password 密码
     * @return
     */
    bool userLogin(QString username, QString password);
    /**
     * @brief 用户注册
     * @param username 用户名
     * @param password 密码
     * @return
     */
    bool userRegister(QString username, QString password);
    /**
     * @brief 获取最新的传感器数据
     * @param deviceTypeID 传感器类别
     * @param deviceTypeIndex 传感器索引
     * @return
     */
    int getIntValue(int deviceTypeID, int deviceTypeIndex);
    double getDoubleValue(int deviceTypeID, int deviceTypeIndex);
    bool getBoolValue(int deviceTypeID, int deviceTypeIndex);
    QString getStringValue(int deviceTypeID, int deviceTypeIndex);
    /**
     * @brief 获取设备列表
     * @return 返回值遵照通信协议
     */
    QJsonArray getDeviceList();
    /**
     * @brief 获取设备历史数据
     * @param mode  0--1天
     *              1--1周
     * @param deviceTypeId 设备类型
     * @param deviceTypeIndex 设备索引
     * @return 返回值遵照通信协议
     */
    QJsonArray getDeviceHistory(int deviceTypeId, int deviceTypeIndex, int mode);
    /**
     * @brief 获取设备类型
     * @return
     */
    QJsonArray getDeviceType();
    /**
     * @brief 添加设备
     * @param name 名称
     * @param deviceTypeId 类型
     * @param deviceTypeIndex 索引
     * @param unit 单位
     * @param remarks 备注
     * @return
     */
    bool addDevice(QString name, int deviceTypeId, int deviceTypeIndex, QString unit,
                   QString remarks);
    /**
     * @brief 删除设备
     * @param deviceTypeId 类型
     * @param deviceTypeIndex 索引
     * @return
     */
    bool delDevice(int deviceTypeId, int deviceTypeIndex);

protected:
    static SqlMain * obj;
    QSqlDatabase *db;
};

#endif // SQLMAIN_H
